package com.zhanghe.study.java8.stream;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 映射
 */
public class TestStreamApi1 {
    private static List<User> list = new ArrayList<>(
            Arrays.asList(
                    new User(1,"张三",18, (byte) 0),
                    new User(2,"李四",20, (byte) 1),
                    new User(3,"王五",16, (byte) 0),
                    new User(4,"赵六",25, (byte) 1),
                    new User(5,"张三",30, (byte) 0),
                    new User(6,"张三",8, (byte) 0)
            )
    );

    public static void main(String[] args) {
        System.out.println("============testMap=============");
        testMap();
        System.out.println("============testFlatMap=============");
        testFlatMap();
    }

    /**
     * map 接收lambda，将元素转换为其他形式或提取信息。接收一个函数作为函数，
     * 该函数会被应用到每个元素上，并将其映射成一个新的元素
     *
     * 如果函数返回的是一个流的话，使用map会使得流里存储着多个流
     */
    public static void testMap(){
        // 使用Function  R apply(T t);
        list.stream().map(User::getAge).forEach(System.out::println);
    }

    /**
     * flatMap  接收一个函数作为参数，将流中的每个值都换成另一个流，然后把所有流连接成一个流
     *
     * 如果函数返回的是一个流，使用flatMap会使得函数返回的流中的元素放到一个流中
     */
    public static void testFlatMap(){
        // 要求Function  R apply(T t);中返回值是一个Stream流
        List<String> add = new ArrayList<>();
        add.add("添加元素");
        List<String> strings = list.stream().map(User::getName).collect(Collectors.toList());
        strings.stream().flatMap(
                TestStreamApi1::joinStream
        ).forEach(System.out::println);
    }

    public static Stream<Character> joinStream(String add){
        List<Character> characters = new ArrayList<>();
        for(Character c : add.toCharArray()){
            characters.add(c);
        }
        return characters.stream();
    }




    static class User{
        private long id;
        private String name;
        private int age;
        private byte sex;

        public User(long id,String name,int age,byte sex){
            this.id = id;
            this.name = name;
            this.age = age;
            this.sex = sex;
        }

        public long getId() {
            return id;
        }

        public void setId(long id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public byte getSex() {
            return sex;
        }

        public void setSex(byte sex) {
            this.sex = sex;
        }
    }
}
